let Promise = require('./promise');

// 实现finally  （面试必问） 无论成功是否都执行的方法(可使用面向切片实现)
// 也是koa的原理
Promise.prototype.finally = function (callback) {
  //如果不考虑返回promise的情况 这样实现就够了↓
  /*return this.then(data=>{
    callback();
    return data;
  },err=>{
    callback();
    throw err;
  })*/

  //TODO 4.0 ↓
  return this.then(data => {
    return new Promise((resolve, reject) => {
      resolve(callback());
    }).then(() => data);
  }, err => {
    return new Promise((resolve, reject) => {
      resolve(callback()); //TODO 4.1 reject不会等待 会直接走下个then的失败回调
    }).then(() =>{ throw err});
  });
  //↑写简洁一点↓
  /*let P = this.constructor;
  return this.then(
    value  => P.resolve(callback()).then(() => value),
    reason => P.resolve(callback()).then(() => { throw reason })
  );*/
};

let promise = new Promise((resolve,reject)=>{
  reject(100);
})
  //不管前面promise是success还是reject 都会执行finally注册的
  .finally(()=>{ //←finally就是跑龙套的 它接受的参数函数是不接受参数的 并且它之前的promise是什么状态 它最终返回的promise就是什么状态(它本身并不改变它接受的状态)
    // console.log('hello');

    //如果finally里返回的是一个promise，会等待这个promise有结果后再往下走 TODO 4.0
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('finally');
        resolve();
      }, 3000);
    });
  })
  .then(data=>{
    console.log('data',data);
  },err=>{ // ←也会走这个then
    console.log('err', err);
  })
